#include <DHT.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// 定义 DHT11 传感器引脚和类型
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

// 定义 OLED 屏幕参数
#define SCREEN_WIDTH 128 // OLED 屏幕宽度，单位像素
#define SCREEN_HEIGHT 64 // OLED 屏幕高度，单位像素
#define OLED_RESET    -1 // 重置引脚 # (如果没有则设为 -1)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(9600);
  dht.begin();
  
  // 初始化 OLED 屏幕
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  display.clearDisplay();
  display.display();
}

void Get_Color_Data()
{
  String color_data = "";//定义字符串变量color_data，用于存储颜色数据
  uint16_t clear, red, green, blue; //分别定义用于存储红、绿、蓝三色值变量
  tcs.getRGBC(&red, &green, &blue, &clear); //将原始R/G/B值转换为色温（以度为单位）
  tcs.lock();  //禁用中断（可省略）
  
  uint32_t sum = clear;           
  float r, g, b;                  
  r = red; r /= sum;              
  g = green; g /= sum;            
  b = blue; b /= sum;             
  r *= 256; g *= 256; b *= 256;   

  // 假设黑色的 RGB 值都接近 0，白色的 RGB 值都接近 255
  // 可根据实际情况调整阈值
  const int BLACK_THRESHOLD = 30;
  const int WHITE_THRESHOLD = 220;

  if (r < BLACK_THRESHOLD && g < BLACK_THRESHOLD && b < BLACK_THRESHOLD) {
    color_data = "black";
    // 识别到黑色，舵机转到 0 度
    myServo.write(0);
    // 这里可以设置小车动作，暂时保持原有的前进动作
    Motor_Go(Forward);
  } else if (r > WHITE_THRESHOLD && g > WHITE_THRESHOLD && b > WHITE_THRESHOLD) {
    color_data = "white";
    // 识别到白色，舵机转到 180 度
    myServo.write(180);
    // 这里可以设置小车动作，暂时保持原有的前进动作
    Motor_Go(Forward);
  } else {                       
    color_data = "none";
    Motor_Go(Stop);
  }
  Serial.println(color_data); //显示内容

  // 读取温湿度数据
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  // 检查是否读取成功
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // 检查温湿度是否在正常范围内
  bool isHumidityNormal = (humidity >= 30 && humidity <= 70);
  bool isTemperatureNormal = (temperature >= 0 && temperature <= 45);

  // 在 OLED 上显示信息
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print("Temp: ");
  display.print(temperature);
  display.print(" C (");
  display.print(isTemperatureNormal ? "Normal" : "Abnormal");
  display.print(")");
  display.setCursor(0, 10);
  display.print("Humidity: ");
  display.print(humidity);
  display.print(" % (");
  display.print(isHumidityNormal ? "Normal" : "Abnormal");
  display.print(")");
  display.setCursor(0, 20);
  display.print("Color: ");
  display.print(color_data);
  display.display();

  delay(20);  
}

